#include"stdio.h"
#include"string.h"
#include"global.h"
#include"syscall.h"
#include"file.h"

int printf(const char* fmt,...){
	char buff[1024];
	va_list ap;
	va_start(ap,fmt);
	int len=vsprintf(buff,fmt,ap);
	va_end(ap);
	return write(stdout_no,buff,len);
}

int sprintf(char* buffer,const char* fmt,...){
	va_list ap;
	va_start(ap,fmt);
	int len=vsprintf(buffer,fmt,ap);
	va_end(ap);
	return len;
}

int vsprintf(char* buffer,const char* fmt,va_list ap){
	const char* p=fmt;	
	char* q=buffer;
	char f;
	int arg_i;
	char arg_c;
	char* arg_str;
	while(*p){
		if(*p=='%'){
			f=*(++p);
			if(f=='d'){
				arg_i=va_arg(ap,int);
				if(arg_i<0){
				       	arg_i=-arg_i;
					*q++='-';
				}
				itoa(arg_i,&q,10);
			}else if(f=='x'){
				arg_i=va_arg(ap,int);
				itoa(arg_i,&q,16);
			}else if(f=='s'){
				arg_str=va_arg(ap,char*);
				strcpy(q,arg_str);
				q+=strlen(arg_str);
			}else if(f=='c'){
				arg_c=va_arg(ap,char);
				*q++=arg_c;
			}
			p++;
			continue;
		}
		*q++=*p++;
	}
	*q=0;
	return strlen(buffer);
}

void itoa(int value,char** pbuffer,int base){
	int a,b;
	b=a=value;
	a/=base;
	b%=base;
	if(a){
		itoa(a,pbuffer,base);
	}
	**pbuffer= b<=9 ? b+'0' : b-10+'a';
	*pbuffer+=1;
}
